# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/28 18:53 
@Author  : ZhangShenao 
@File    : unpacking.py
@Desc    : 拆包
当多个变量使用同一个赋值符号赋值时,Python会自动将序列中的值拆解出来,按照顺序逐一赋值给每个变量
tuple、list、dict、str都支持拆包
对dict进行拆包时,是按照key进行拆包
拆包要求右边的序列长度要和左边的变量个数相同,如果不同,可以使用*变量接收多个值,多个变量会组合成一个list
"""

# 变量可以连续赋值
# 连续赋值时,是从右至左依次被赋值
a = b = c = 1
print(a, b, c)

# 拆包
# 当多个变量使用同一个赋值符号赋值时,Python会自动将序列中的值拆解出来,按照顺序逐一赋值给每个变量
# tuple、list、dict、str都支持拆包
# tuple的拆包
a, b, c = (1, 2, 3)
print(a, b, c)
# str的拆包
s1, s2, s3 = 'abc'
print(s1, s2, s3)
# list的拆包
l1, l2, l3 = [4, 5, 6]
print(l1, l2, l3)
# 对dict进行拆包时,是按照key进行拆包
k1, k2, k3 = {'a': 1, 'b': 2, 'c': 3}
print(k1, k2, k3)  # a b c

# 拆包要求右边的序列长度要和左边的变量个数相同,如果不同,可以使用*变量接收多个值,多个变量会组合成一个list
a, *b = (1, 2, 3, 4)
print(f'a = {a}, b = {b}')  # a = 1, b = [2, 3, 4]
*a, b = ('a', 'b', 'c')
print(f'a = {a}, b = {b}')  # a = ['a', 'b'], b = c
a, *b, c = (1, 2, 3, 4, 5)
print(f'a = {a}, b = {b}, c = {c}')  # a = 1, b = [2, 3, 4], c = 5

# 使用下面的操作,可以快速交换两个变量的值
x, y = 1, 2
x, y = y, x
print(f'x = {x}, y = {y}')  # x = 2, y = 1

# or关键字也可以用于赋值语句
# x = a or b
# 它表达的是:如果bool(a)为True,则将a赋值给x;否则将b赋值给x
x = 'ab' or 'unknown'
print(f'x = {x}')  # x = ab
y = '' or 'unknown'
print(f'y = {y}')  # y = unknown
